package cn.demoncat.util.lang;

import cn.demoncat.util.exception.ParamRuntimeException;
import cn.demoncat.util.lang.constant.StringConstant;
import org.apache.commons.lang3.StringUtils;

/**
 * 描述：参数有效性验证
 *
 * @author yxl
 *
 * @version 2.0
 *
 * @since 2016-9-20
 */
public final class ParamValidUtil {
 
	/**
	 * 断言：判断参数是否有效
	 * 
	 * @param msg		错误消息
	 * @param checks	参数有效性校验表达式，参数有效时返回true
	 * 
	 * @exception ParamRuntimeException	有1个参数为false
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年12月21日
	 */
	public static void assertCheck(String msg, boolean ...checks){
		for (boolean check : checks) {
			if (!check) {
				throw StringUtils.isBlank(msg) ? ParamRuntimeException.ILLEGAL : new ParamRuntimeException(msg);
			}
		}
	}
	
	/**
	 * 断言：判断参数是否有效
	 * 
	 * @param checks	参数有效性校验表达式，参数有效时返回true
	 * 
	 * @exception ParamRuntimeException	有1个参数为false
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年12月21日
	 */
	public static void check(boolean ...checks){
		assertCheck(null, checks);
	}
	
	/**
	 * 功能描述：验证手机号是否合法(不做非空校验)
	 *
	 * @param mobile	11位数字
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-20
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static boolean isMobile(String mobile) {
		return RegexpUtil.matcher(mobile, RegexpUtil.MOBILE);
	}
	
	/**
	 * 功能描述：验证电话号是否合法(不做非空校验)
	 *
	 * @param tel	电话号
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-20
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static boolean isTel(String tel) {
		return RegexpUtil.matcher(tel, RegexpUtil.TELEPHONE);
	}
	
	/**
	 * 功能描述：验证电话号/手机号是否合法(不做非空校验)
	 *
	 * @param phone	电话号/手机号
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-20
	 */
	public static boolean isPhone(String phone) {
		return RegexpUtil.matcher(phone, RegexpUtil.TELEPHONE) || RegexpUtil.matcher(phone, RegexpUtil.MOBILE);
	}

	/**
	 * 
	 * 功能描述：验证邮箱号码是否合法(不做非空校验)
	 *
	 * @param email 邮箱，字母数字@字母数字
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-20
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static boolean isEmail(String email) {
		// 不能包含#
		if (email.contains(StringConstant.HASH)) {
			return false;
		}
		return RegexpUtil.matcher(email, RegexpUtil.EMAIL);
	}

	/**
	 * 
	 * 功能描述：校验密码格式
	 *
	 * @param pwd	MD5码，即32位
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-21
	 */
	public static boolean isPwd(String pwd) {
		// MD5加密一次后传递
		return pwd.length() == 32;
	}
	
	/**
	 * 
	 * 功能描述：校验密码格式
	 *
	 * @param pwd	原生密码，6 ~ 30位，非纯数字
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-21
	 */
	public static boolean isPassword(String pwd) {
		return pwd.length() > 5 && pwd.length() < 30 && !StringUtils.isNumeric(pwd);
	}

	/**
	 * 校验用户名
	 * 
	 * @param userName	2 ~ 30位，小写字母和数字，非纯数字
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年12月25日
	 */
	public static boolean isUserName(String userName) {
		return userName.length() > 1 && userName.length() <= 30 && StringUtil.isAlphanumeric(userName) && !StringUtils.isNumeric(userName);
	}
	
	/**
	 * 校验身份证号
	 * 
	 * @param idCard	
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年12月25日
	 */
	public static boolean isIdCard(String idCard) {
		return RegexpUtil.matcher(idCard, RegexpUtil.ID_CARD);
	}

	/**
	 * 校验银行卡号
	 *
	 * @param bankCard
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2018年12月25日
	 */
	public static boolean isBankCard(String bankCard) {
		return RegexpUtil.matcher(bankCard, RegexpUtil.BANK_CARD);
	}

	/**
	 * 
	 * 功能描述：验证短信验证码是否合法(不做非空校验)
	 *
	 * @param smsCode	6位整数
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-20
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static boolean isSmsCode(String smsCode) {
		return RegexpUtil.matcher(smsCode, RegexpUtil.SMS_CODE);
	}

	/**
	 * 
	 * 功能描述：验证图片验证码是否合法(不做非空校验)
	 *
	 * @param imgCode	4位整数
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-20
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static boolean isImgCode(String imgCode) {
		return RegexpUtil.matcher(imgCode, RegexpUtil.IMG_CODE);
	}

	/**
	 * 
	 * 功能描述：验证邮箱验证码是否合法(不做非空校验)
	 *
	 * @param emailCode	6位整数
	 * @return
	 * 
	 * @author yxl
	 *
	 * @since 2016-9-20
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static boolean isEmailCode(String emailCode) {
		return RegexpUtil.matcher(emailCode, RegexpUtil.EMAIL_CODE);
	}
}
